package com.carbon.system.service.impl;
//
//import com.carbon.common.service.BaseServiceImpl;
//import com.carbon.system.entity.MenuVO;
//import com.carbon.system.service.MenuService;
//
//public class MenuServiceImpl extends BaseServiceImpl<MenuVOMapper, MenuVO> implements MenuService {
//}
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.carbon.common.service.BaseServiceImpl;
import com.carbon.system.entity.Menu;
import com.carbon.system.entity.MenuVO;
import com.carbon.system.mapper.AccountRoleMapper;
import com.carbon.system.mapper.MenuMapper;
import com.carbon.system.mapper.RoleMenuMapper;
import com.carbon.system.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, Menu> implements MenuService {
    @Autowired
    private AccountRoleMapper accountRoleMapper;
    @Autowired
    private RoleMenuMapper roleMenuMapper;
    @Autowired
    private MenuMapper menuMapper;

    // 获取当前用户的菜单列表（树形结构）
    public List<MenuVO> getUserMenus(Long accountId) {

        // 1. 根据用户ID查询关联的角色ID
        List<Long> roleIds = accountRoleMapper.selectRoleIdsByAccountId(accountId);
        if (roleIds == null || roleIds.isEmpty()) {
            return null; // 无角色，返回空列表
        }

        // 2. 根据角色ID列表查询关联的菜单ID
        List<Long> menuIds = roleMenuMapper.selectMenuIdsByRoleIds(roleIds);
        if (menuIds == null || menuIds.isEmpty()) {
            return null; // 无菜单权限，返回空列表
        }

        // 3. 查询菜单详情（只查 is_menu=1 且 hidden=0 的菜单）
        List<MenuVO> menus = menuMapper.selectMenusByIds(menuIds);

        // 4. 构建树形结构（根节点 parentId=0）
        return buildMenuTree(menus, -1);
    }

    // 递归构建树形菜单
    public List<MenuVO> buildMenuTree(List<MenuVO> menus, Integer parentId) {
        return menus.stream()
                .filter(menu -> menu.getParentId().equals(parentId)) // 筛选父节点
                .map(menu -> {
                    // 递归查询子菜单
                    menu.setChildren(buildMenuTree(menus, menu.getId()));
                    return menu;
                })
                .sorted((m1, m2) -> m1.getSort().compareTo(m2.getSort())) // 按排序号排序
                .collect(Collectors.toList());
    }

    @Override
    public List<MenuVO> getAllPermissions() {
        List<MenuVO> menus = menuMapper.selectMenus();

        // 4. 构建树形结构（根节点 parentId=0）
        return buildMenuTree(menus, -1);
    }

    @Override
    public boolean saveMenu(Menu menu) {
        int insert = menuMapper.saveMenu(menu);
        return insert>0;
    }

    @Override
    public boolean updateMenuById(Menu menuVO) {
        int i = menuMapper.updateMenuById(menuVO);
        return i>0;

    }

    @Override
    public Integer deleteMenuById(Long menuId) {
        return menuMapper.deleteMenuById(menuId);
    }

    @Override
    public List selectSons(Long menuId) {
        return menuMapper.selectSons(menuId);
    }

//    @Override
//    public boolean saveBatch(Collection<MenuVO> entityList, int batchSize) {
//        return false;
//    }
//
//    @Override
//    public boolean saveOrUpdateBatch(Collection<MenuVO> entityList, int batchSize) {
//        return false;
//    }
//
//    @Override
//    public boolean updateBatchById(Collection<MenuVO> entityList, int batchSize) {
//        return false;
//    }
//
//    @Override
//    public boolean saveOrUpdate(MenuVO entity) {
//        return false;
//    }
//
//    @Override
//    public MenuVO getOne(Wrapper<MenuVO> queryWrapper, boolean throwEx) {
//        return null;
//    }
//
//    @Override
//    public Map<String, Object> getMap(Wrapper<MenuVO> queryWrapper) {
//        return null;
//    }
//
//    @Override
//    public <V> V getObj(Wrapper<MenuVO> queryWrapper, Function<? super Object, V> mapper) {
//        return null;
//    }

    @Override
    public MenuMapper getBaseMapper() {
        return null;
    }
}